#ifndef IODIALOG_H
#define IODIALOG_H

#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QHash>
#include <QVector>
#include <QString>
#include <QDebug>
#include <utility>
#include <QTextCodec>
//#include <QStandardItemModel>
#include <QMessageBox>
#include <QListWidgetItem>
#include <QFile>
#include <QTextStream>
#include <QCoreApplication>
#include <QDebug>
#include <QRegularExpression>
#include <QtXlsx>
#include <QFile>
#include <QDebug>
#include <QFileDialog>
#include "xlsxdocument.h"
#include "xlsxworksheet.h"
#include "xlsxworkbook.h"
#include "ioinfolist.h"

QT_BEGIN_NAMESPACE
namespace Ui { class IODialog; }
QT_END_NAMESPACE


enum Type{
    INPUTTYPE,
    OUTPUTTYPE
};


class IODialog : public QMainWindow
{
    Q_OBJECT

public:
    IODialog(QWidget *parent = nullptr);
    ~IODialog();
    void initUI();
    void initSql();
    void initData();
    void connectSignalAndSlot();
    void loadData();
    void loadIntoUI();
    void initChinese();

    void addItem(const IOData* data);         //通过界面输入的方式添加元素

    void getFuncAndHardware(QString& funcStr,QString& hardStr,const QString& pinName);
    void setFunction(const QString& pinName,QString& func);
    void setHardwareConnect(QString& hardStr);
    bool changePage(QVector<QVector<IOData*> >& data,int index);
    void modifyMotorAndStationFile(const QString& filePath,const QString& startStr,int number);
    void insertPinIntoDataBase(const QHash<QString,QString>& hash,
                               const QString& table,
                               const QString& chinese,
                               const QString& letter);
    void loadDataIntoFile();
    void resizeVector(QVector<QVector<IOData*> >& data);
    void loadDataintoVectorAndShow(const QString& pinName,const QString& signal);
    void modifyVectorByIndex(QVector<QVector<IOData*> >& data,int row, int col, const QString& label);
    void readXlsxDataintoVector();
    IOData* getDataBypinName(QString& pinName,Type type);
    void testReadpinNameFromDatabase();
    void loadMotorDataintoDatabase();
    void handleMotorConfig(QXlsx::Document& xlsx);
    void writeMotorIntoFile(const QHash<QString,QString>& hashTable);
    //槽函数
    //void onConfirmBtnClicked();
    void onWriteBtnClicked();
    void onAddOrModifyBtnClicked();
    void onWriteFileBtnClicked();
    void onInitMotorBtnClicked();
    void onPrevPageBtnClicked();
    void onNextPageBtnClicked();
    void onModifyCardNumBtnClicked();
    void onLoadXlsxBtnClicked();
    //选择栏切换
    void onComboBoxIndexChanged();
    //当label通过手动切换的时候，需要修改对应数组中的内容
    void onLabelTextChanged(const QString& label,const QString& hardwareStr);
signals:
    void labelTextChanged(const QString& label,const QString& hardwareStr);
private:
    Ui::IODialog *ui;
    QSqlDatabase dataBase;                      //总的数据
    QHash<QString,QString> hash;                //用来记录中文名和字母的映射关系，防止每次都去数据库中查找
    QHash<QString,QString> newPinHash;          //用来记录新的新的引脚或者修改
    QHash<QString,QString> motorHash;           //用来记录电机名称和下标的关系
    int cardIdx;                                //用来记录当前是哪个卡
    int curCardNumIdx;                          //用来记录该卡当前共有多少个数量
    int curCardNum;                             //用来记录该卡当前共有多少个数量
    QVector<QVector<IOData*> >inputData;        //用来记录当前输入界面的数据
    QVector<QVector<IOData*> >outputData;       //用来记录当前输出界面的数据
    Type type;                                  //当前类型：输入或者输出
    QString dirPath;                            //用来记录所有文件所在的目录路径
    int inputDataSize;                          //输入数组的大小
    int outputDataSize;                         //输出数组的大小
};
#endif // IODIALOG_H
